#ifndef __data_shuttle_simple_http_request_header_file__
#define __data_shuttle_simple_http_request_header_file__

#include "../pointer.h"
#include "../common.h"
#include "../task.h"
#include "httpmsg.h"

namespace datashuttle
{
namespace server
{
// 服务端的http request & httpresponse。
// 其主要的是HttpRequest，用于接收和处理请求
// 而在HttpResponse里面，主要是向client发送数据

class HttpResponse : public HttpMessage , public CommunicationTask
{
public:
	HttpResponse(CommunicationTaskPtr comm);
	virtual ~HttpResponse();

	// flush headers to client
	// after invoked this function, no more start line or headers operation could be done
	bool	flushHeader();

	COMM_ERROR addBodyData( const char* data, size_t dataSize );

	COMM_ERROR bodyDataComplete();
};

// 在服务端，只有受到了完整的http header以后才会创建一个HttpRequest
class HttpRequest: public HttpMessage, public SharedObject
{
public:

	HttpRequest( CommunicationTaskPtr comm );
	virtual ~HttpRequest();

	bool	getLocalInfo( std::string& localip, std::string& localport );
	bool	getPeerInfo( std::string& peerip, std::string& peerport );

	// 由于body的数据可能不是一次可以完全收集完毕，所以需要一个函数来通知说client的body数据到了
	void	onBodydata( const char* data, size_t size );

	// body数据接受完毕
	// 可以在这个时候展开对于request的处理
	void	onBodyDataComplete();

	// TODO: 目的是如果遇到数据格式错误，就调用这个函数。那么岂不是还需要准备一个格式错误码
	// 麻烦，真是麻烦
	viod	onDataError();

private:
	CommunicationTaskPtr	mComm;
};
}//namespace server


namespace client
{

class HttpRequest : public HttpMesage, public CommunicationTask
{
};

}//namespace client

}//namespace datashuttle

#endif//__data_shuttle_simple_http_request_header_file__

